<?php
/** costumer_mapper.php
 * Project name: project_name
 * Created on: 20.11.2011
 * Author: Matias Thomsen
 * 
 * Handling of database actions regarding customers...
 */
require 'CCustomer.php';

class CCustomerMapper extends CSql {

    public function getSingleCustomer($kundenNr, $inBearbeitung = 1) {
            if ( $inBearbeitung == 1 ){
                 $condition = "AND `inBearbeitung` = '$inBearbeitung'";
            }else{
                $condition = "AND `inBearbeitung` IS NULL";
            }
            $query =    "SELECT
                                * ,
                                (SELECT CONCAT(`vorname`,' ', `name`) FROM `kssystem`.`Mitarbeiter` WHERE `idMitarbeiter` = `betreuerId`) AS `betreuer`,
                                (SELECT CONCAT(`vorname`,' ', `name`) FROM `kssystem`.`Mitarbeiter` WHERE `idMitarbeiter` = `bearbeiterId`) AS `bearbeiter`,
                                (SELECT CONCAT(`vorname`,' ', `name`) FROM `kssystem`.`Mitarbeiter` WHERE `idMitarbeiter` = `freigeberId`) AS `freigeber`,
                                (SELECT `bezeichnung` FROM `kssystem`.`Gstelle` WHERE `idGstelle` = `gstelleId`) AS `gstelle`,
                                (SELECT `bezeichnung` FROM `kssystem`.`Branche` WHERE `idBranche` = `brancheId`) AS `branche`,
                                (SELECT `bezeichnung` FROM `kssystem`.`Berufsgruppe` WHERE `idBerufsgruppe` = `berufsgruppeId`) AS `berufsgruppe`,
                                (SELECT `bezeichnung` FROM `kssystem`.`Beruf` WHERE `idBeruf` = `berufId`) AS `beruf`
                        FROM
                                `kssystem`.`Kunde`
                        WHERE
                            `kundenNr` = '$kundenNr' $condition
                        ";
//            echo $query;
            $stm = $this->prepare($query);
            $stm->execute();
            if ($stm->errorCode() == 0 && $stm->rowCount() == 1) {
                $fetch = $stm->fetchAll();
//                print_r($fetch);
                $customer = new CCustomer();
                $customer->setIdKunde($fetch[0]['idKunde']);
                $customer->setKundenNr($fetch[0]['kundenNr']);
                $customer->setGstelleId($fetch[0]['gstelleId']);
                        $customer->setGstelleBezeichnung($fetch[0]['gstelle']);
                $customer->setBetreuerId($fetch[0]['betreuerId']);
                        $customer->setBetreuerName($fetch[0]['betreuer']);
                $customer->setBearbeiterId($fetch[0]['bearbeiterId']);
                        $customer->setBearbeiterName($fetch[0]['bearbeiter']);
                $customer->setStatus($fetch[0]['status']);
                $customer->setFreigeberId($fetch[0]['freigeberId']);
                        $customer->setFreigeberName($fetch[0]['freigeber']);
                $customer->setAnrede($fetch[0]['anrede']);
                $customer->setTitel($fetch[0]['titel']);
                $customer->setName($fetch[0]['vorname']);
                $customer->setNachname($fetch[0]['nachname']);
                $customer->setGeburtsname($fetch[0]['geburtsname']);
                $customer->setStrasse_nr($fetch[0]['strasse_nr']);
                $customer->setPlz($fetch[0]['plz']);
                $customer->setOrt($fetch[0]['ort']);
                $customer->setWohnhaftSeit($fetch[0]['wohnhaftSeit']);
                $customer->setGeburtsdatum($fetch[0]['geburtsdatum']);
                $customer->setFamilienstand($fetch[0]['familienstand']);
                $customer->setStaatsange($fetch[0]['staatsange']);
                $customer->setEmail($fetch[0]['email']);
                $customer->setTelefon_1($fetch[0]['telefon_1']);
                $customer->setTelefon_2($fetch[0]['telefon_2']);
                $customer->setDatenschutz($fetch[0]['datenschutz']);
                $customer->setMonatEinkommen($fetch[0]['monatEinkommen']);
                $customer->setExtraEinkommen($fetch[0]['extraEinkommen']);
                $customer->setWohnsituation($fetch[0]['wohnsituation']);
                $customer->setBrancheId($fetch[0]['brancheId']);
                        $customer->setBranche($fetch[0]['branche']);
                $customer->setBerufsgruppeId($fetch[0]['berufsgruppeId']);
                        $customer->setBerufsgruppe($fetch[0]['berufsgruppe']);
                $customer->setBerufId($fetch[0]['berufId']);
                        $customer->setBeruf($fetch[0]['beruf']);
                $customer->setInBearbeitung($fetch[0]['inBearbeitung']);
                    

                return $customer;
            }else {
                return false;
            }
    }
    
    public function getCustomers($att, $staff = 0, $gstelle = 0) {
            $counter = "";
            switch ( $att ){
                case "enable"       :   $condition = "(`status` = '2' OR `status` = '7') AND `inBearbeitung` = '1' AND `bearbeiterId` != '$staff'"; break;
                case "active"       :   $condition = "`status` = '1'"; break;
                case "marked"       :   $condition = "`status` = '2'"; break;
                case "edit"       :   
//                    $query = "SELECT *, count(`kundenNr`) AS `counter` FROM `kssystem`.`Kunde` 
//                                WHERE `status` != '5' AND gstelleId = '5' 
//                                    AND (`status` = '1' OR `status` = '2') AND gstelleId = '5' 
//                                GROUP BY `kundenNr` HAVING `counter` = 1";
                    $query = "SELECT * FROM `kssystem`.`Kunde`
                                WHERE `gstelleId` = '$gstelle' AND `status` != 2 AND `status` != 7 AND `status` != 5 AND
                                (
                                    (
                                        `inBearbeitung` IS NULL AND `kundenNr` NOT IN
                                        (
                                            SELECT `kundenNr` FROM `kssystem`.`Kunde`
                                            WHERE `inBearbeitung` IS NOT NULL
                                        )
                                    )
                                    OR
                                    (
                                        `inBearbeitung` IS NOT NULL AND `kundenNr` IN
                                        (
                                            SELECT `kundenNr` FROM `kssystem`.`Kunde`
                                            WHERE `inBearbeitung` IS NOT NULL
                                        )
                                    )
                                )
                            ";
//                    $condition = "(`status` != '1' AND `status` != '2' AND `inBearbeitung` = '1') OR (`status` = '1' AND `inBearbeitung` IS NULL)  GROUP BY `kundenNr` HAVING `counter` = '1'";
//                    $counter = ",count(`kundenNr`) as `counter`";
                    break;
                case "edit-e"       :   $condition = "`status` = '2' AND `inBearbeitung` = '1' AND `bearbeiterId` != '$staff'"; break;
                case "disabled"     :   $condition = "`status` = '6'"; break;
                case "marked-delete"   :
                    $query = "SELECT
                                    *
                                FROM
                                    `Kunde`
                                WHERE 
                                    `Kunde`.`status` = '1'
                                  
                                  AND
                                    `Kunde`.`kundenNr`
                                IN
                                    (
                                        SELECT
                                            `Kunde`.`kundenNr`
                                        FROM 
                                            `Kunde`, `LoeschVormerkung`
                                        WHERE 
                                            `Kunde`.`kundenNr` = `LoeschVormerkung`.`kundenNr` AND gstelleId = '$gstelle'
                                            AND `LoeschVormerkung`.`bearbeiterId` != '$staff'
                                    )";
                    break;
                case "delete"   :
                    $query = "SELECT
                                    *
                                FROM
                                    `Kunde`
                                WHERE 
                                    `Kunde`.`status` = '1' AND gstelleId = '$gstelle'
                                  AND
                                    `Kunde`.`kundenNr`
                                NOT IN
                                    (
                                        SELECT
                                            `Kunde`.`kundenNr`
                                        FROM 
                                            `Kunde`, `LoeschVormerkung`
                                        WHERE 
                                            `Kunde`.`kundenNr` = `LoeschVormerkung`.`kundenNr` AND gstelleId = '$gstelle'
                                    )";
                    break;
                case 'zentrale'  :
                    $query = "SELECT * FROM `kssystem`.`Kunde` WHERE `gstelleId` IN
                            (
                                SELECT `idGstelle`
                                    FROM `kssystem`.`Gstelle`, `kssystem`.`Filiale`, `kssystem`.`Bezirk`, `kssystem`.`Zentrale`
                                    WHERE `filialeId` = `idFiliale`
                                        AND `bezirkId` = `idBezirk`
                                        AND `zentraleId` = `idZentrale`
                                        AND `zentraleId` = '$gstelle'
                                        AND `status` = '1'
                            )";
                    break;
                case 'bezirk'  :
                    $query = "SELECT * FROM `kssystem`.`Kunde` WHERE `gstelleId` IN
                            (
                                SELECT `idGstelle`
                                    FROM `kssystem`.`Gstelle`, `kssystem`.`Filiale`, `kssystem`.`Bezirk`
                                    WHERE `filialeId` = `idFiliale`
                                        AND `bezirkId` = `idBezirk`
                                        AND `bezirkId` = '$gstelle'
                                        AND `status` = '1'
                            )";
                    break;
                case 'filiale'  :
                    $query = "
                            SELECT * FROM `kssystem`.`Kunde` WHERE `gstelleId` IN
                            (
                                SELECT `idGstelle` FROM `kssystem`.`Gstelle`, `kssystem`.`Filiale` WHERE `filialeId` = `idFiliale`
                                AND `filialeId` = '$gstelle'
                                AND `status` = '1'
                            )";

            }
            if ( !isset($query) ){
                $query = "SELECT *$counter FROM
                            `Kunde`
                        WHERE
                            `status` != '5' AND gstelleId = '$gstelle' AND $condition
                        ";
            }
//            echo $query."<br/>";
            $stm = $this->prepare($query);
            $stm->execute();
//            print_r($stm->errorinfo());
            if ($stm->errorCode() == 0 && $stm->rowCount() > 0) {
                    $fetch = $stm->fetchAll();
                    
                    foreach ( $fetch as $row ){
                            $customer = null;
                            $customer = new CCustomer();
                            
                            $customer->setIdKunde($row['idKunde']);
                            $customer->setKundenNr($row['kundenNr']);
                            $customer->setGstelleId($row['gstelleId']);
                            $customer->setBetreuerId($row['betreuerId']);
                            $customer->setBearbeiterId($row['bearbeiterId']);
                            $customer->setStatus($row['status']);
                            $customer->setFreigeberId($row['freigeberId']);
                            $customer->setAnrede($row['anrede']);
                            $customer->setTitel($row['titel']);
                            $customer->setName($row['vorname']);
                            $customer->setNachname($row['nachname']);
                            $customer->setGeburtsname($row['geburtsname']);
                            $customer->setStrasse_nr($row['strasse_nr']);
                            $customer->setPlz($row['plz']);
                            $customer->setOrt($row['ort']);
                            $customer->setWohnhaftSeit($row['wohnhaftSeit']);
                            $customer->setGeburtsdatum($row['geburtsdatum']);
                            $customer->setFamilienstand($row['familienstand']);
                            $customer->setStaatsange($row['staatsange']);
                            $customer->setTelefon_1($row['telefon_1']);
                            $customer->setTelefon_2($row['telefon_2']);
                            $customer->setDatenschutz($row['datenschutz']);
                            $customer->setMonatEinkommen($row['monatEinkommen']);
                            $customer->setExtraEinkommen($row['extraEinkommen']);
                            $customer->setWohnsituation($row['wohnsituation']);
                            $customer->setBrancheId($row['brancheId']);
                            $customer->setBerufsgruppeId($row['berufsgruppeId']);
                            $customer->setBerufId($row['berufId']);
                            $customer->setInBearbeitung($row['inBearbeitung']);
//                            print_r($customer);
                            $customerArray[] = $customer;
                    }
                    
                    return $customerArray;
            } else {
                    return 0;
            }
    }

    public function saveCustomer(CCustomer $customer) {
        
            $stm = $this->prepare("INSERT INTO
                    Kunde (
                        kundenNr, gstelleId, betreuerId,
                        bearbeiterId, status, freigeberId,
                        anrede, titel, vorname,
                        nachname, geburtsname, strasse_nr,
                        plz, ort, wohnhaftSeit,
                        geburtsdatum, familienstand, staatsange,
                        telefon_1, telefon_2, datenschutz,
                        monatEinkommen, extraEinkommen, wohnsituation,
                        brancheId, berufsgruppeId, berufId,
                        inBearbeitung, email
                    ) VALUES (
                        :kundenNr, :gstelleId, :betreuerId,
                        :bearbeiterId, :status, :freigeberId,
                        :anrede, :titel, :vorname,
                        :nachname, :geburtsname, :strasse_nr,
                        :plz, :ort, :wohnhaftSeit,
                        :geburtsdatum, :familienstand, :staatsange,
                        :telefon_1, :telefon_2, :datenschutz,
                        :monatEinkommen, :extraEinkommen, :wohnsituation,
                        :brancheId, :berufsgruppeId, :berufId,
                        :inBearbeitung, :email
                    )");

            $stm->bindParam(':kundenNr', $customer->getKundenNr());
            $stm->bindParam(':gstelleId', $customer->getGstelleId());
            $stm->bindParam(':betreuerId', $customer->getBetreuerId());
            $stm->bindParam(':bearbeiterId', $customer->getBearbeiterId());
            $stm->bindParam(':status', $customer->getStatus());
            $stm->bindParam(':freigeberId', $customer->getFreigeberId());
            $stm->bindParam(':anrede', $customer->getAnrede());
            $stm->bindParam(':titel', $customer->getTitel());
            $stm->bindParam(':vorname', $customer->getName());
            $stm->bindParam(':nachname', $customer->getNachname());
            $stm->bindParam(':geburtsname', $customer->getGeburtsname());
            $stm->bindParam(':strasse_nr', $customer->getStrasse_nr());
            $stm->bindParam(':plz', $customer->getPlz());
            $stm->bindParam(':ort', $customer->getOrt());
            $stm->bindParam(':wohnhaftSeit', $customer->getWohnhaftSeit());
            $stm->bindParam(':geburtsdatum', $customer->getGeburtsdatum());
            $stm->bindParam(':familienstand', $customer->getFamilienstand());
            $stm->bindParam(':staatsange', $customer->getStaatsange());
            $stm->bindParam(':telefon_1', $customer->getTelefon_1());
            $stm->bindParam(':telefon_2', $customer->getTelefon_2());
            $stm->bindParam(':datenschutz', $customer->getDatenschutz());
            $stm->bindParam(':monatEinkommen', $customer->getMonatEinkommen());
            $stm->bindParam(':extraEinkommen', $customer->getExtraEinkommen());
            $stm->bindParam(':wohnsituation', $customer->getWohnsituation());
//            die($customer->getWohnsituation());
            $stm->bindParam(':brancheId', $customer->getBrancheId());
            $stm->bindParam(':berufsgruppeId', $customer->getBerufsgruppeId());
            $stm->bindParam(':berufId', $customer->getBerufId());
            $stm->bindParam(':inBearbeitung', $customer->getInBearbeitung());
            $stm->bindParam(':email', $customer->getEmail());

            $stm->execute();
            
            if ( $stm->errorCode() == 0 && $this->lastInsertId() ) {
                    return 1;
            } else {//print_r($stm->errorInfo());
                    foreach ( $stm->errorInfo() as $msg ) {
                            if ( substr_count($msg, "Duplicate entry") == 1 ) {
                                    return "Der Kunde ist schon vorhanden und kann nicht erneut eingetragen werden.";
                            }
                    }
                    return "Es ist leider ein Fehler aufgetreten";
            }
    }

    public function updateCustomer(CCustomer $customer) {
                    $stm = $this->prepare("UPDATE
                    Kunde SET
                        gstelleId = :gstelleId,
                        betreuerId = :betreuerId,
                        bearbeiterId = :bearbeiterId,
                        status = :status,
                        freigeberId = :freigeberId,
                        anrede = :anrede,
                        titel = :titel,
                        vorname = :vorname,
                        nachname = :nachname,
                        geburtsname = :geburtsname,
                        strasse_nr = :strasse_nr,
                        plz = :plz,
                        ort = :ort,
                        wohnhaftSeit = :wohnhaftSeit,
                        geburtsdatum = :geburtsdatum,
                        familienstand = :familienstand,
                        staatsange = :staatsange,
                        telefon_1 = :telefon_1,
                        telefon_2 = :telefon_2,
                        datenschutz = :datenschutz,
                        monatEinkommen = :monatEinkommen,
                        extraEinkommen = :extraEinkommen,
                        wohnsituation = :wohnsituation,
                        brancheId = :brancheId,
                        berufsgruppeId = :berufsgruppeId,
                        berufId = :berufId,
                        inBearbeitung = :inBearbeitung,
                        email = :email
                    WHERE
                        kundenNr = :kundenNr
                        AND inBearbeitung IS NULL
                    ");

            $stm->bindParam(':kundenNr', $customer->getKundenNr());
            $stm->bindParam(':gstelleId', $customer->getGstelleId());
            $stm->bindParam(':betreuerId', $customer->getBetreuerId());
            $stm->bindParam(':bearbeiterId', $customer->getBearbeiterId());
            $stm->bindParam(':status', $customer->getStatus());
            $stm->bindParam(':freigeberId', $customer->getFreigeberId());
            $stm->bindParam(':anrede', $customer->getAnrede());
            $stm->bindParam(':titel', $customer->getTitel());
            $stm->bindParam(':vorname', $customer->getName());
            $stm->bindParam(':nachname', $customer->getNachname());
            $stm->bindParam(':geburtsname', $customer->getGeburtsname());
            $stm->bindParam(':strasse_nr', $customer->getStrasse_nr());
            $stm->bindParam(':plz', $customer->getPlz());
            $stm->bindParam(':ort', $customer->getOrt());
            $stm->bindParam(':wohnhaftSeit', $customer->getWohnhaftSeit());
            $stm->bindParam(':geburtsdatum', $customer->getGeburtsdatum());
            $stm->bindParam(':familienstand', $customer->getFamilienstand());
            $stm->bindParam(':staatsange', $customer->getStaatsange());
            $stm->bindParam(':telefon_1', $customer->getTelefon_1());
            $stm->bindParam(':telefon_2', $customer->getTelefon_2());
            $stm->bindParam(':datenschutz', $customer->getDatenschutz());
            $stm->bindParam(':monatEinkommen', $customer->getMonatEinkommen());
            $stm->bindParam(':extraEinkommen', $customer->getExtraEinkommen());
            $stm->bindParam(':wohnsituation', $customer->getWohnsituation());
            $stm->bindParam(':brancheId', $customer->getBrancheId());
            $stm->bindParam(':berufsgruppeId', $customer->getBerufsgruppeId());
            $stm->bindParam(':berufId', $customer->getBerufId());
            $stm->bindParam(':inBearbeitung', $customer->getInBearbeitung());
            $stm->bindParam(':email', $customer->getEmail());
            $stm->execute();
//            print_r($stm->errorInfo());
            if ( $stm->errorCode() == 0 ) {
//                echo "----".$customer->getStatus()."----";
//                echo "----".$stm->rowCount()."----";
//                print_r($stm->errorInfo());
                    return true;
            } else {
                    print_r($stm->errorInfo());
                    return "Es ist leider ein Fehler aufgetreten";
            }
    }

    public function updateCustomerStatus($kundenNummer, $status) {
//        $query = "UPDATE
//                    `kunden`
//                  SET
//                    `status` = '$status'
//                  WHERE
//                    `kundenNr = '$kundenNummer'";
//        $stm = $this->prepare($query);
//        $stm->execute();
//        if ( $stm->errorCode() == 0 && $stm->rowCount() == 0 ){
//            return 0;
//        }else{
//            return "Es ist ein Fehler aufgetreten, versuchen sie es später nochmal";
//        }
    }
    
    public function markDeletion(CCustomer $customer, $staff, $comment) {
        //function return false if no errors occurs
                $kundenNr = $customer->getKundenNr();
                $query = "INSERT
                                INTO `Loeschvormerkung`
                                (
                                    `bearbeiterId`,
                                    `kundenNr`,
                                    `bemerkung`
                                )
                                VALUES
                                (
                                    :bearbeiterId,
                                    :kundenNr,
                                    :bemerkung
                                )";
                $stm = $this->prepare($query);
                $stm->bindParam(':bearbeiterId', $staff);
                $stm->bindParam(':kundenNr', $customer->getKundenNr());
                $stm->bindParam(':bemerkung', $comment);
                $stm->execute();
                
                if ( $stm->errorCode() == 0 ) {
                        return 0;
                }else{
                        foreach ( $stm->errorInfo() as $msg ) {
                                if ( substr_count($msg, "Duplicate entry") == 1 ) {
                                        return "Der Kunde wurde bereits zur L&ouml;schung vorgemerkt.";
                                }
                        }
                        return "Es ist leider ein Fehler aufgetreten";
                }
                return "Es ist leider ein Fehler aufgetreten.";
        }

    public function deleteCustomer(CCustomer $customer, $dummy = 0 ) {
            
        try{
                $this->beginTransaction();
                
                if ( $dummy == 0 ){
                    $customer->setStatus(5);
                    $result = $this->updateCustomer($customer);
                    
                    $query = "DELETE FROM 
                                    LoeschVormerkung
                                WHERE 
                                    `kundenNr` = '".$customer->getKundenNr()."'"
                    ;
                    
                }elseif ( $dummy == 1 ){
                    $query = "DELETE FROM 
                                    Kunde
                                WHERE 
                                    `kundenNr` = '".$customer->getKundenNr()."'
                                  AND
                                    `inBearbeitung` = '1'"
                    ;
                }
                $result = $this->exec($query);
                
                $this->commit();
                
                if ( $result > 0 ){
                        return true;
                }else{
                        return false;
                }
                
                
        }catch (Exception $ex){
                $this->rollBack();
                return "Es ist leider ein Fehler aufgetreten.";
        }
            
    }

    public function transferCustomer(CCustomer $customer) {
        
    }
    
    public function customerContactMail($gstelle) {
            $query = "SELECT 
                `vorname`, `nachname`, `email`, `idKunde`
              FROM 
                `kssystem`.`Kunde` 
              WHERE
                `status` = '1' AND `email` IS NOT null AND  `datenschutz` = '1' AND `email`<> '' AND `gstelleId` = '$gstelle'";
            $stm = $this->prepare($query);
            $stm->execute();
            if ($stm->errorCode() == 0 && $stm->rowCount() > 0) {
                    $customers = array();
                    $fetch = $stm->fetchAll();
                    
                    foreach ( $fetch as $row ){
                            $customer = null;
                            $customer = new CCustomer();
                            
                            $customer->setIdKunde($row['idKunde']);
                            $customer->setName($row['vorname']);
                            $customer->setNachname($row['nachname']);
                            $customer->setEmail($row['email']);
                            
                            $customers[] = $customer;
                    }
                    
                    return $customers;
                    
            }else{
                    return false;
            }
    }
    
    public function getStelle($staffId) {
        $stm = $this->prepare("SELECT gstelleId AS stelle FROM `kssystem`.`Mitarbeiter`
                    WHERE `idMitarbeiter` = $staffId");
        $stm->execute();
        $result = $stm->fetch();
        if ( $result['stelle'] != 0 ){
            return $result['stelle'];
        }
        
        $stm = $this->prepare("SELECT filialeId AS stelle FROM `kssystem`.`Mitarbeiter`
                    WHERE `idMitarbeiter` = $staffId");
        $stm->execute();
        $result = $stm->fetch();
        if ( $result['stelle'] != 0 ){
            return $result['stelle'];
        }
        
        $stm = $this->prepare("SELECT bezirkId AS stelle FROM `kssystem`.`Mitarbeiter`
                    WHERE `idMitarbeiter` = $staffId");
        $stm->execute();
        $result = $stm->fetch();
        if ( $result['stelle'] != 0 ){
            return $result['stelle'];
        }
        
        $stm = $this->prepare("SELECT zentraleId AS stelle FROM `kssystem`.`Mitarbeiter`
                    WHERE `idMitarbeiter` = $staffId");
        $stm->execute();
        $result = $stm->fetch();
        if ( $result['stelle'] != 0 ){
            return $result['stelle'];
        }
        
    }

}

?>